<?php
/**
 * Управления модулями.
 * @author nrnwest@gmail.com
 *
 */
class Admin_ModulesController extends Arm_Controller_Action
{
    /**
     * Управления модулями в системе
     */
    public function indexAction()
    {
        $this->view->modules = Arm_Module::getInstance()->getDataModules(); 
    }
    
    /**
     * Создания нового модуля в системе.
     */
    public function createAction()
    {
        $form = new Admin_Form_NewModule();
        $this->view->form = $form;
        if($this->getRequest()->isPost() and $form->isValid($this->getPost())) {
            $data   = $form->getValues();
            $module = $data['newmodule'];
            $builder = new Arm_Module_Builder();
            $builder->create($module);
            $install = new Arm_Module_Install($module);
            $install->install();
            $this->addFlashMessender(Arm_Translate::_('Модуль %s создан, и установлен в системе', $module));
            $this->_redirect('/admin/modules/');
      }
    } 

    
    /**
     * Управления модулем
     */
    public function directionAction()
    {
        $name =  $this->_getParam('name');
        $this->view->name = $name;
        // получения параметров для модул
        $modules =  Arm_Module::getInstance()->getDataModules();
        $this->view->data = $modules[$name];
    }
    
    /**
     * Установка модуля в системе.
     */
    public function installAction()
    {
      $install = new Arm_Module_Install($this->_getParam('name'));
      $install->install();
      $this->addFlashMessender(Arm_Translate::_('Модуль %s установлен', $this->_getParam('name')));
      $this->_redirect('/admin/modules/');
    }
    
    
    /**
     * Включени выключения модуля.
     */
    public function onoffAction()
    {
      $module  = $this->_getParam('name');
      $onOff   = $this->_getParam('onoff');
      Arm_Module::getInstance()->onOff($module, $onOff);
      if($onOff === '1') {
          $type = Arm_Translate::_('Включен');
      } else {
          $type = Arm_Translate::_('Выключен');
      }
      $this->addFlashMessender(Arm_Translate::_('Модуль %s %s', array($module, $type)));
      $this->_redirect('/admin/modules/');
      return;
    }
    
    /**
     * Удаляем модуль.
     */
    public function delAction()
    {
       $module = $this->_getParam('name');
       $this->view->name = $module;
       $del = $this->_getParam('del');
       $instal = new Arm_Module_Install($module);
       // защита от двойного нажатия, супер баг. глюк давала панель отладки
     /*  if(false === Arm_Module::getInstance()->getIdModule($module)) {
          $this->_redirect('/admin/modules/'); 
       }*/
       if($del === '0') {
           $instal->unInstall(0);
             //Деинстелируем модуль, оставляя файловую систему модуля.
             $this->addFlashMessender(Arm_Translate::_('Модуль %s денистелирован', $module));
             $this->_redirect('/admin/modules/');
       }elseif($del ==='1') {
           $instal->unInstall(1);
            // денистелируем модуль, плюс удаляем файловую систему.
            $this->addFlashMessender(Arm_Translate::_('Модуль %s денистелирован и удален', $module));
            $this->_redirect('/admin/modules/');    
       }
   
    }
    
    /**
     * Редактирования конфиг файла модуля.
     */
    public function configAction()
    {
      $name = $this->_getParam('name');
      $this->view->name = $name;
      $path = Arm_Core::getPathModule($name) . 'configs/application.ini';
      $form = new Admin_Form_Config();
      $this->view->form = $form;
      if($this->getRequest()->isPost() === false) {
      $form->config->setValue(file_get_contents($path));
      } else if($form->isValid($this->getPost())) {
          // запишем
          $data = $form->getValues();
          $fp = fopen($path, 'wb');
          fwrite($fp, $data['config']);
          fclose($fp);
          $this->addFlashMessender(Arm_Translate::_('Конфиг записан'));
          $this->_redirect($this->getRequest()->getRequestUri());
           
      }
    }

    /**
     * Управления правами доступа модуля.
     */
    public function aclAction()
    {
      $name = $this->_getParam('name');
      $this->view->name = $name;
      $path = Arm_Core::getPathModule($name) . 'configs/acl.xml';
      $form = new Admin_Form_Config();
      $form->getElement('config')->setValidators(array(new Admin_Validate_Config('xml'), new Admin_Validate_Acl($name)))
      ->removeFilter('stripTags');
      
      $this->view->form = $form;
      if($this->getRequest()->isPost() === false) {
          $form->config->setValue(file_get_contents($path));
      } else if($form->isValid($this->getPost())) {
          // запишем
          $data = $form->getValues();
          $fp = fopen($path, 'wb');
          fwrite($fp, $data['config']);
          fclose($fp);
          $this->addFlashMessender(Arm_Translate::_('Конфиг записан'));
          $this->_redirect($this->getRequest()->getRequestUri());
      }
    }
    
    /**
     * управления навигацией модуля.
     */
    public function navigationAction()
    {
       $module = $this->_getParam('name'); 
       // выводи меню которые сущестует в файловой системе модуля
       // мы сдесь даем функциональность перестановки определеного меню
       // модуля, или удаления данного меню, как файла так и записей с базы данных.
       $this->view->data = Arm_Module::getInstance()->getNavigations($module);     
       $this->view->module = $module;
       $exe = $this->_getParam('exe');
       $menu = $this->_getParam('menu');
       $navigation = new Arm_Navigation();
       switch ($exe) {
       	case 'reinstall':
       	    $navigation->setMenuModule($module, $menu);
       	    $this->addFlashMessender(Arm_Translate::_('Переустановлено меню %s', $menu));
       	break;
       	case 'install':
       	    $navigation->setMenuModule($module, $menu);
       	    $this->addFlashMessender(Arm_Translate::_('Установлено меню %s', $menu));
       	break;
       	 	case 'dell':
       	    $navigation->deleteModuleSystemMenu(Arm_Module::getInstance()->getIdModule($module), $navigation->getIdMenu($menu));
       	    $this->addFlashMessender(Arm_Translate::_('Удалено меню %s', $menu));
       	break;
       	 	case 'write':
       	 	    // записать меню в исходники
       	 	   $navigation->writeMenuModule($menu, $module);
       	 	   break;
  
       }
    }
    
    /**
     * Управления cron задачами.
     */
    public function cronAction()
    {
       if($this->_getParam('edit') !== null) {
           $this->_forward('editcron');
       }
       $cron = new Arm_Cron();
       if($this->_getParam('delete') !== null) {
           // удаляем 
           $cron->deleteComand($this->_getParam('delete'));
       }
       $module = $this->_getParam('name');
       $this->view->module = $module;
       $data = $cron->getComands(Arm_Module::getInstance()->getIdModule($module));
       $this->view->data = $data;
    }
    
    /**
     * Редактирования команды
     */
    public function editcronAction()
    {
        $cron = new Arm_Cron();
        $id   = $this->_getParam('edit');
        $form = new Admin_Form_EditCron();
        if($this->getRequest()->isPost() === false) {
            $form->setDefaults($cron->getComand($id));
        } else if ($form->isValid($this->getPost())) {
            $cron->updateComand($id, $form->getValues());
            $this->_redirect('/admin/modules/cron/name/' . $this->_getParam('name'));
        }
        $this->view->form = $form;
        
    }
    
    /**
     * Добавления задачи cron
     */
    public function addcronAction()
    {
        $form = new Admin_Form_EditCron();
        $this->view->form = $form;
        $module = $this->_getParam('name');
        if($this->getRequest()->isPost() and $form->isValid($this->getPost())) {
            $cron = new Arm_Cron();
            $data = $form->getValues();
            $cron->addComand(Arm_Module::getInstance()->getIdModule($module), $data['cmd'], $data['period'], $data['description']);
            $this->_redirect('/admin/modules/cron/name/' . $module);
        }
    }
    
    /**
     * Запись не обходимых файлов и данны в директорию module/install
     * 
     * для переноса модуля в другой проект.
     */
    public function createinstallAction()
    {
        $module = $this->_getParam('name');
        Arm_Module::getInstance()->createModuleIstall($module);
        // создадим архив
        $install = new Arm_Module_Install($module);
        $install->createArchivInstall();
        $this->addFlashMessender(Arm_Translate::_('Инстталяция модуля "%s" создана', $module));
        $this->_redirect('/admin/modules/direction/name/' . $module);
    }
    
    /**
     * Инсталляторы модулей
     */
    public function installarchivsAction()
    {
        $nameArchiv = $this->_getParam('name');
        $array = explode('.', $nameArchiv);
        $name  = $array[0];
        $path = Arm_Core::getPathModule('install') . 'install/modules/' . $nameArchiv;
         if($this->_getParam('install') === '1') {
             $install = new Arm_Module_Install($name);
             $install->installModuleArchiv();
             $this->addFlashMessender(Arm_Translate::_('Модуль "%s" установлен', $name));
             $this->_redirect('/admin/modules/installarchivs/');
         }
         if($this->_getParam('dellete') === '1') {
             unlink($path);
             $this->_redirect('/admin/modules/installarchivs/');
         }
         if($this->_getParam('load') === '1') {
             $unload = new Arm_File_Unload();
             $unload->send($path);
         }
         $this->view->data = Arm_Module::getInstance()->getArchivsInstall();
    }
    
    /**
     * Вывод страниц модуля.
     */
    public function pageAction()
    {
        $page   = new Arm_Page();
        $idPage = $this->_getParam('idPage');
        $module = $this->_getParam('name');
        $this->view->module = $module;
        if($this->_getParam('dellete') !== null) {
            $page->deletePage($idPage);
            $this->_redirect('/admin/modules/page/name/' . $module);
        }
        if($this->_getParam('edit') !== null) {
            $form = new Admin_Form_Page();
            if($this->getRequest()->isPost() and $form->isValid($this->getPost())) {
                $page->upDate($form->getValues(), $idPage);
                $this->addFlashMessender(Arm_Translate::_('Страница отредактирована'));
                $this->_redirect('/admin/modules/page/name/' . $module);
            } else if ($this->getRequest()->isPost() === false) {
                $form->setDefaults($page->getPage(null, $idPage));
            }
            $this->view->form = $form;
            return;
        }
        
        $this->view->pages = $page->getPages(Arm_Module::getInstance()->getIdModule($module));
    }
    

}